package gui;

import java.util.Vector;

import javax.swing.ListModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

import simulator.Order;
import simulator.Simulator;
import simulator.SimulatorListener;
import simulator.Truck;

/**
 * Reprezentuje datovy model seznamu nakladnich vozu.
 * Tento prvek je obsluhovan na zaklade implementace listeneru simulatoru <code>SimulatorListener</code>.
 * Prvky jsou pridavany automaticky, vyvola-li simulator udalost tykajici se nakladniho vozu.
 * 
 * @author Petr Altman
 *
 */
public class TruckListModel implements ListModel, SimulatorListener {

	private Vector<TruckListItem> items = new Vector<TruckListItem>();
	
	private ListDataListener listener = null;
	
	/**
	 * Prida prvek do seznamu.
	 * @param item Prvek typu <code>TruckListItem</code>.
	 */
	public void addItem(TruckListItem item) {
		items.add(item);
		
		if(listener != null)
			listener.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, items.size() - 1, items.size() - 1));
	}

	/**
	 * Vymaze seznam prvku.
	 */
	public void clear() {
		int size = items.size();
		items.clear();
		
		if(listener != null)
			listener.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, size));
	}
	
	/**
	 * Odstrani prvek ze seznamu na zaklade jeho indexu v seznamu.
	 * @param index Index odstranovaneho prvku.
	 */
	public void removeItem(int index) {
		items.remove(index);
				
		if(listener != null)
			listener.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index, index));
	}
	
	/**
	 * Aktualizuje prveky seznamu.
	 */
	private void updateItems() {		
		if(listener != null)
			listener.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, items.size() - 1));
	}
	
	/**
	 * Odstarni prvek ze seznamu na zaklade jeho reference.
	 * @param item Prvek k odstraneni.
	 */
	public void removeItem(TruckListItem item) {
		removeItem(items.indexOf(item));
	}
	
	@Override
	public void addListDataListener(ListDataListener listener) {
		this.listener = listener;
	}

	@Override
	public Object getElementAt(int index) {
		return items.elementAt(index);
	}

	@Override
	public int getSize() {
		return items.size();
	}

	@Override
	public void removeListDataListener(ListDataListener listener) {
		this.listener = listener;
	}

	@Override
	public void onInitOrders(Simulator simulator, Order[] orders) {
		
	}

	@Override
	public void onOrderCountChanged(Simulator simulator, Order order) {
		
	}

	@Override
	public void onOrderProcessed(Simulator simulator, Order order) {
		
	}

	@Override
	public void onOrderReceived(Simulator simulator, Order order) {
		
	}

	@Override
	public void onOrderRefused(Simulator simulator, Order order) {
		
	}

	@Override
	public void onSimulationExecuted(Simulator simulator) {
		
	}

	@Override
	public void onSimulationFinished(Simulator simulator) {
		
	}

	@Override
	public void onTruckCreated(Simulator simulator, Truck truck) {
		// vytvoreni noveho prvku, pokud neni instance nakladniho vozu null
		if(truck != null)
			addItem(new TruckListItem(simulator, truck));
	}

	@Override
	public void onTruckProcessed(Simulator simulator, Truck truck) {
		updateItems();
	}

	@Override
	public void onTruckReplanned(Simulator simulator, Truck truck) {
		updateItems();
	}

	@Override
	public void onTruckStatusChanged(Simulator simulator, Truck truck) {
		updateItems();
	}

}
